

import java.util.Iterator;
import org.apache.uima.*;
import org.apache.uima.analysis_component.JCasAnnotator_ImplBase;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.cas.Type;
import org.apache.uima.cas.text.AnnotationIndex;
import org.apache.uima.jcas.JCas;
import java.lang.reflect.*;


public class typeMappingAnalysisEngineAnnotator extends JCasAnnotator_ImplBase {

	private final static String SRC_TYPE = "sourceType";
	private final static String TGT_TYPE = "targetType";
	private String sourceTypeStr;
	private String targetTypeStr;


	public void initialize(UimaContext context) 
	{
		//Récupération des paramètres
		sourceTypeStr = (String) context.getConfigParameterValue(SRC_TYPE);
		targetTypeStr = (String) context.getConfigParameterValue(TGT_TYPE);
	}

	
	
	
	public void process(JCas aJCas) throws AnalysisEngineProcessException {
		
		//Récupération du type source
		Type typeSrc = aJCas.getTypeSystem().getType(sourceTypeStr);

		//Dans le cas où le type source n'existe pas		
		if (typeSrc == null)
		{
			String errmsg = "Le type " + sourceTypeStr + " n'est pas déclaré dans le TypeSystem !";
		    throw new AnalysisEngineProcessException(errmsg, new Object[]{typeSrc});			
		}
		
		//EXECUTION NORMALE
		try{
		//Génération des classes correspondants aux Strings sourceTypeStr et targetTypeStr
		Class SrcClass = Class.forName(sourceTypeStr);
		Class TgtClass = Class.forName(targetTypeStr);
		
		//Génération des constructeurs des classes source/target
		Constructor srcConstr = SrcClass.getConstructor(new Class [] {JCas.class});
		Constructor tgtConstr = TgtClass.getConstructor(new Class [] {JCas.class});

		//Récupération de l'ensemble/index des annotations du type source
		AnnotationIndex idxSrc = (AnnotationIndex)aJCas.getAnnotationIndex(typeSrc);
		
		//Création d'un itérateur sur cet index
		Iterator itSrc = idxSrc.iterator();
		
		//Tant qu'il y a des annotations de type source
		while(itSrc.hasNext())
		{
			
			//Création de l'annotation courante
			Object s = srcConstr.newInstance(new Object [] {aJCas});
			s = itSrc.next();
			SrcClass.cast(s);	//On caste l'objet en type de SrcClass
			
			//Récupération des méthodes getBegin/getEnd/getCoveredText de la classe source
			Method getBegin = SrcClass.getMethod("getBegin", new Class[] {});
			Method getEnd = SrcClass.getMethod("getEnd", new Class[] {});
			Method getCoveredText = SrcClass.getMethod("getCoveredText", new Class[] {});
			
			//Création d'un tableau d'objet null
			Object[] args = null;
			
			//Récupération du début de l'annotation courante
			int begin = (Integer)getBegin.invoke(s,args);
			
			//Récupération du début de l'annotation courante
			int end = (Integer)getEnd.invoke(s,args);
			
			//Récupération du Covered text de l'annotation courante
			String coveredText = (String)getCoveredText.invoke(s,args);
			
			
			System.out.println("text "+coveredText+ " begin " +begin + " end "+ end);
			
			//Création d'une annotation du type target
				Object t = tgtConstr.newInstance(new Object [] {aJCas});
				TgtClass.cast(t);
				
				//Récupération des méthodes setBegin/setEnd/addToIndexes de la classe target
				Method setBegin = TgtClass.getMethod("setBegin", new Class[] {int.class});
				Method setEnd = TgtClass.getMethod("setEnd", new Class[] {int.class});
				Method addToIndexes = TgtClass.getMethod("addToIndexes", new Class[] {});
				
				//Ajouts à l'annotation du type target
				setBegin.invoke(t,begin);
				setEnd.invoke(t,end);
				addToIndexes.invoke(t,args);
		}
		}
				catch (IllegalArgumentException e) 
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				} 
				catch (IllegalAccessException e) 
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				} 
				catch (InvocationTargetException e) 
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (SecurityException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (NoSuchMethodException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (InstantiationException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
	}
